package pe.edu.upc.dsd.qwerty.wsreserva.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.edu.upc.dsd.qwerty.wsreserva.dao.VuelosDAO;
import pe.edu.upc.dsd.qwerty.wsreserva.model.Asiento;
import pe.edu.upc.dsd.qwerty.wsreserva.model.Pasajero;
import pe.edu.upc.dsd.qwerty.wsreserva.model.Vuelo;

@Repository
@Transactional
public class VuelosDAOImpl implements VuelosDAO {

	private EntityManager em;

	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.em = em;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Vuelo> listarVuelos() {
		return em.createQuery("from Vuelo").getResultList();
	}

	@Override
	public Vuelo obtenerVuelo(String idVuelo) {
		return (Vuelo) em.createQuery(" from Vuelo a where a.idVuelo = :id ")
		.setParameter("id", Integer.parseInt(idVuelo) ).getResultList().get(0);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Asiento> obtenerAsientos(String vuelo) {
		return em.createQuery("select a from Asiento a where a.idVuelo = :id and a.estado=0")
		.setParameter("id", Integer.parseInt(vuelo) ).getResultList();
	}

	@Override
	public Asiento obtenerAsiento( Integer idAsiento) {
		return (Asiento) em.createQuery("select a from Asiento a  where a.idAsiento = :id2 ")
		.setParameter("id2", idAsiento ).getResultList().get(0);
	}

	@Override
	public void reservarAsiento(Integer idAsiento,Integer estado,Integer idPasajero, String uuid){
		 em.createQuery(" update Asiento a set a.estado = :estado, a.pasajero.idpasajero=:idpasajero, a.uuid = :uuid where a.idAsiento=:idasiento ")
			.setParameter("estado", estado )
			.setParameter("idpasajero", idPasajero )
			.setParameter("uuid", uuid )
			.setParameter("idasiento", idAsiento )
			.executeUpdate();
	}
	
	@Override
	public void procesarAsiento(Integer idAsiento, Integer estado) {
		 em.createQuery(" update Asiento a set a.estado = :estado where idAsiento=:idasiento")
			.setParameter("estado", estado )
			.setParameter("idasiento", idAsiento )
			.executeUpdate();
	}

	@Override
	public void procesarVuelo(Integer idVuelo, Integer estado) {
		// TODO Auto-generated method stub
		System.out.println("proceso el vuelo");
	}

	
	@Override
	public void procesarPasajero(Integer idPasajero, Integer estado) {
		// TODO Auto-generated method stub
		System.out.println("proceso pasajero");
	}

	
	@Override
	public void registraVuelo(Vuelo vuelo) {
		em.persist(vuelo);
	}

	
	@Override
	public void registraPasajero(Pasajero pasajero) {
		em.persist(pasajero);
	}

	
	@Override
	public void registraAsiento(Asiento asiento) {
		em.persist(asiento);
	}

	@Override
	public void confirmarReserva(String uuid, Integer estado) {
		 em.createQuery(" update Asiento a set a.estado = :estado where uuid=:uuid ")
			.setParameter("estado", estado )
			.setParameter("uuid", uuid )
			.executeUpdate();
	}

	@Override
	public Asiento obtenerAsiento(String uuid) {
		return (Asiento) em.createQuery("select a from Asiento a  where a.uuid = :uuid  ")
				.setParameter("uuid", uuid ).getResultList().get(0);
	}

}
